﻿/****************************************************************************/
/*											                                */
/* Clase : Controlador_EliminarInspector			                        */
/* Autor : Marc Esteve Fernández					                        */
/* Descripción: Controlador caso de uso para eliminar un inspector          */
/* 											                                */
/****************************************************************************/
using System;
using NHibernate;
using CRC.NHibernate;
using CRC.GestionSalones.Dominio.Clases;
using CRC.Inspecciones.Dominio.Clases;
using System.Collections.Generic;
using System.Collections;

namespace CRC.Inspecciones.Dominio.Controlador
{
    class Controlador_EliminarInspector
    {
        
        private static String strQryPuedoElimInspector = 
            "select count(*), c.NombreCRC " + 
            "from congregacion c where c.Presidente.Id = :id " +
            "or c.Secretario.Id = :id or c.SuperitendenteCircuito = :id";


        /**
         * eliminarInspector: Eliminar el inspector identificado por el parametro indicado
         *  precondicion: El inspector existe
         */
        public void eliminarInspector(int pIntInspector) 
        {

            ISession session = null;
            ITransaction tx = null;
            try
            {
                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                Persona inspector = (Persona)session.Load(typeof(Persona), pIntInspector);
                
                IList<Zona> zonas = session.CreateQuery("from Zona").List<Zona>();
                foreach (Zona z in zonas)
                {
                    if (z.Inspector.Id == pIntInspector)
                        throw new ApplicationException("No se puede eliminar el inspector. La zona "
                            + z.Nombre +
                            " quedaría sin inspector."
                        );
                }

                IList res = session.CreateQuery(strQryPuedoElimInspector).SetParameter("id", pIntInspector).List();
                if ((int)res[0] > 0)
                {
                    throw new ApplicationException(
                        "No se puede eliminar el inspector. " +
                        "Este es presidente/secretario/superintendente circuito de la congregación " 
                        + (int)res[1]);
                }

                //TODO comprobar que no esta asignado en una zona 
                //y que no es presidente, secretario o superintendente
                // en alguna congregación

                //if (inspector.ZonaAsignada != null)
                //{
                //    throw new Exception("No se puede eliminar el inspector porque tiene un zona asignada bajo su responsabilidad.");
                //}

                session.Delete(inspector);
                tx.Commit();
            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }
        }

        public void darDeBajaInspector(int pIntInspector)
        {

            ISession session = null;
            ITransaction tx = null;
            try
            {
                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                Persona inspector = (Persona)session.Load(typeof(Persona), pIntInspector);
                IList<Zona> zonas = session.CreateQuery("from Zona").List<Zona>();
                foreach (Zona z in zonas)
                {
                    if (z.Inspector.Id == pIntInspector)
                        throw new ApplicationException("No de puede dar de baja el inspector. La zona " 
                            + z.Nombre + 
                            " quedaría sin inspector."
                        );
                }
                

                session.Delete(inspector);
                tx.Commit();
            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }
        }
    }
}
